package com.uzai.console.service.mini;

import com.alibaba.fastjson.JSONObject;
import com.uzai.console.jsonvo.mini.*;

import java.util.List;

/**
 * @author liuqi
 * @date 2021年07月15日 18:49
 */
public interface MiniOptService {

    /**
     * 启动票据推送服务
     * 该 API 用于启动ticket推送服务
     * POST https://api.weixin.qq.com/cgi-bin/component/api_start_push_ticket
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param component_appid
     * @return null
     */
    boolean startPushTicket(String component_appid, String component_secret);

    /**
     * 验证票据component_verify_ticket
     * 在第三方平台创建审核通过后，微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param component_appid
     * @return null
     */
    String getComponentVerifyTicket(String component_appid);

    /**
     * 验证票据component_verify_ticket
     * 在第三方平台创建审核通过后，微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket
     * @author jitwxs
     * @date 2023/11/17 10:34
     * @return null
     */
     String getComponentVerifyTicket();

    /**
     * 令牌component_access_token
     * 令牌（component_access_token）是第三方平台接口的调用凭据。令牌的获取是有限制的，每个令牌的有效期为 2 小时，请自行做好令牌的管理，在令牌快过期时（比如1小时50分），重新调用接口获取。
     * 如未特殊说明，令牌一般作为被调用接口的 GET 参数 component_access_token 的值使用
     * POST https://api.weixin.qq.com/cgi-bin/component/api_component_token
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param component_appid
     * @param component_appsecret
     * @param component_verify_ticket 为空，则从缓存中获取
     * @return null
     */
    String getComponentAccessToken(String component_appid, String component_appsecret, String component_verify_ticket);

    /**
     * 令牌component_access_token
     * 令牌（component_access_token）是第三方平台接口的调用凭据。令牌的获取是有限制的，每个令牌的有效期为 2 小时，请自行做好令牌的管理，在令牌快过期时（比如1小时50分），重新调用接口获取。
     * 如未特殊说明，令牌一般作为被调用接口的 GET 参数 component_access_token 的值使用
     * POST https://api.weixin.qq.com/cgi-bin/component/api_component_token
     * @author liuqi
     * @date 2023/11/17 10:34
     * @return null
     */
    String getComponentAccessToken();

    /**
     * 获取预授权码
     * 该接口用于获取预授权码（pre_auth_code）是第三方平台方实现授权托管的必备信息，每个预授权码有效期为 1800秒
     * POST https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token    使用component_access_token
     * @param component_appid 使用第三方平台 appid
     * @return null
     */
    String getPreAuthCode(String component_appid, String access_token);

    /**
     * 通过授权码获取授权信息(获取authorizer_refresh_token和authorizer_appid)
     * 当用户在第三方平台授权页中完成授权流程后，第三方平台开发者可以在回调 URI 中通过 URL 参数获取授权码。使用以下接口可以换取公众号/小程序的授权信息。
     * POST https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=COMPONENT_ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param component_access_token
     * @param component_appid
     * @param authorization_code 授权码, 会在授权成功时返回给第三方平台
     * @return null
     */
    AuthorizationInfo getAuthorizationInfo(String component_access_token, String component_appid, String authorization_code);

    /**
     * 获取授权账号调用令牌authorizer_access_token(此方法返回刷新token，需要更新)
     * 该接口用于获取授权账号的authorizer_access_token。authorizer_access_token 有效期为 2 小时，authorizer_access_token 失效时，可以使用 authorizer_refresh_token 获取新的 authorizer_access_token
     * POST https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param component_access_token
     * @param component_appid
     * @param authorizer_appid         授权方 appid
     * @param authorizer_refresh_token 刷新令牌
     * @return null
     */
    AuthorizerAccessToken getAuthorizerAccessToken(String component_access_token, String component_appid, String authorizer_appid, String authorizer_refresh_token);

    /**
     * 授权链接构建(Pc端)（回调函数返回auth_code）
     * 该接口用于获取授权账号的authorizer_access_token。authorizer_access_token 有效期为 2 小时，authorizer_access_token 失效时，可以使用 authorizer_refresh_token 获取新的 authorizer_access_token
     * https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxx
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param component_appid  第三方平台方 appid
     * @param pre_auth_code    预授权码
     * @param redirect_uri     授权回调 URI(填写格式为https://xxx)。（插件版无该参数） 管理员授权确认之后会自动跳转进入回调 URI，并在 URL 参数中返回授权码和过期时间(redirect_url?auth_code=xxx&expires_in=600)
     * @param auth_type 要授权的账号类型(1 表示手机端仅展示公众号;2 表示仅展示小程序;3 表示公众号和小程序都展示;4表示小程序推客账号;5表示视频号账号；6表示全部，即公众号、小程序、视频号都展示;)
     * @param biz_appid 指定授权唯一的小程序或公众号 (非必要), 如果指定了appid，则只能是该appid的管理员进行授权，其他用户扫码会出现报错
     * @param category_id_list   指定的权限集id列表，如果不指定，则默认拉取当前第三方账号已经全网发布的权限集列表。
     * @return null
     */
    String createAuthUrlPc(String component_appid, String pre_auth_code, String redirect_uri, Integer auth_type, String biz_appid, String category_id_list);

    /**
     * 复用公众号主体快速注册小程序链接构建(回调函数返回ticket)
     * 该接口用于获取授权账号的authorizer_access_token。authorizer_access_token 有效期为 2 小时，authorizer_access_token 失效时，可以使用 authorizer_refresh_token 获取新的 authorizer_access_token
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param appid    公众号的 appid
     * @param component_appid  第三方平台方 appid
     * @param redirect_uri    用户扫码授权后，MP 扫码页面将跳转到该地址(注:1.链接需 urlencode 2.Host 需和第三方平台在微信开放平台上面填写的登 录授权的发起页域名一致
     * @param copy_wx_verify 是否复用公众号的资质进行微信认证(1:申请复用资质进行微信 认证 0:不申请)
     * @return null
     */
    String createFastregisterAuthUrl(String appid, String component_appid, String redirect_uri, String copy_wx_verify);


    /**
     * 复用公众号主体快速注册小程序,返回新建小程序信息
     * 该接口用于获取授权账号的authorizer_access_token。authorizer_access_token 有效期为 2 小时，authorizer_access_token 失效时，可以使用 authorizer_refresh_token 获取新的 authorizer_access_token
     * POST https://api.weixin.qq.com/cgi-bin/account/fastregister?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token    接口调用凭证，该参数为 URL 参数，非 Body 参数。使用authorizer_access_token
     * @param ticket  公众号扫码授权的凭证
     * @return null
     */
    RegisterMiniprogramByOffiaccount registerMiniprogramByOffiaccount(String access_token, String ticket);

    /**
     * 调用本 API 可以获取小程序的基本信息，所属权限集为30
     * 该接口同适用于获取公众号基本信息，所属权限集为3；
     * POST https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token    服务商获得其中之一权限集授权后，可通过使用authorizer_access_token代商家进行调用
     * @return null
     */
    AccountBasicInfo getAccountBasicInfo(String access_token);

    /**
     * 通过该接口可以获取模板库里的模板列表信息
     * 请求方式是get，不是post；
     * GET https://api.weixin.qq.com/wxa/gettemplatelist?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param template_type 可选是0（对应普通模板）和1（对应标准模板），如果不填，则返回全部的
     * @return null
     */
    MiniTemplate getTemplateList(String access_token, Integer template_type);

    /**
     * 通过该接口提交代码
     * 第三方平台需要先通过addToTemplate接口将草稿添加到代码模板库，然后从代码模板库中通过getTemplateList接口获取对应的模板 id（template_id），然后调用本接口可以为已授权的小程序上传代码并生成体验版
     * POST https://api.weixin.qq.com/wxa/commit?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param template_id 代码库中的代码模板 ID，可通过getTemplateList接口获取代码模板template_id
     * @param ext_json 为了方便第三方平台的开发者引入 extAppid 的开发调试工作，引入ext.json配置文件概念，该参数则是用于控制ext.json配置文件的内容
     * @param user_version 代码版本号，开发者可自定义（长度不要超过 64 个字符）
     * @param user_desc 代码描述，开发者可自定义
     * @return null
     */
    MiniBaseResult commitCode(String access_token, Integer template_id, String ext_json, String user_version, String user_desc);

    /**
     * 绑定体验者
     * 第三方平台在帮助旗下授权的小程序提交代码审核之前，可先让小程序运营者体验，体验之前需要将运营者的个人微信号添加到该小程序的体验者名单中
     * POST https://api.weixin.qq.com/wxa/bind_tester?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param wechatid 微信号
     * @return null
     */
    BindTesterResult bindTester(String access_token, String wechatid);

    /**
     * 解除绑定体验者
     * POST https://api.weixin.qq.com/wxa/unbind_tester?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param userstr 人员对应的唯一字符串， 可通过getTester接口获取人员对应的字符串
     * @return null
     */
    MiniBaseResult unbindTester(String access_token, String userstr);

    /**
     * 获取体验者列表
     * 通过本接口可以获取小程序所有已绑定的体验者列表
     * POST https://api.weixin.qq.com/wxa/memberauth?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @return null
     */
    GetTesterResult getTester(String access_token);

    /**
     * 获取体验版二维码
     * 调用本接口可以获取小程序的体验版二维码。使用过程中如遇到问题
     * GET https://api.weixin.qq.com/wxa/get_qrcode?access_token=ACCESS_TOKEN
     *
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @return null
     * @author liuqi
     * @date 2023/11/17 10:34
     */
    byte[] getTrialQRCode(String access_token);

    /**
     * 配置小程序服务器域名
     * 授权给第三方的小程序，其服务器域名只可以为在第三方平台账号中配置的小程序服务器域名，当小程序通过第三方平台发布代码上线后，小程序原先自己配置的服务器域名将被删除，只保留第三方平台的域名，
     * 所以第三方平台在代替小程序发布代码之前，需要调用接口为小程序添加第三方平台自身的域名
     * POST https://api.weixin.qq.com/wxa/modify_domain?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param action 操作类型add-添加;delete-删除;set-覆盖;get-获取
     * @param requestdomain request 合法域名；当 action 是 get 时不需要此字段
     * @param wsrequestdomain socket 合法域名；当 action 是 get 时不需要此字段
     * @param uploaddomain uploadFile 合法域名；当 action 是 get 时不需要此字段
     * @param downloaddomain downloadFile 合法域名；当 action 是 get 时不需要此字段
     * @param udpdomain udp 合法域名；当 action 是 get 时不需要此字段
     * @param tcpdomain tcp 合法域名；当 action 是 get 时不需要此字段
     * @return null
     */
    ModifyServerDomainResult modifyServerDomain(String access_token, String action, List<String> requestdomain, List<String> wsrequestdomain, List<String> uploaddomain, List<String> downloaddomain, List<String> udpdomain, List<String> tcpdomain);

    /**
     * 设置小程序用户隐私保护指引
     * 本接口用于配置第三方代开发小程序的用户隐私保护指引。可根据小程序实际情况进行完善。小程序发布后即向c端用户展示
     * POST https://api.weixin.qq.com/cgi-bin/component/setprivacysetting?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param privacy_ver 用户隐私保护指引的版本，1表示现网版本；2表示开发版。默认是2开发版
     * @param setting_list 要收集的用户信息配置，可选择的用户信息类型参考下方详情。当privacy_ver传2或者不传时，setting_list是必填；当privacy_ver传1时，该参数不可传，否则会报错
     * @param owner_setting 收集方（开发者）信息配置
     * @param sdk_privacy_info_list 该小程序中引用了第三方sdk的信息说明(可以为空)
     * @return null
     */
    MiniBaseResult setPrivacySetting(String access_token, Integer privacy_ver, List<JSONObject> setting_list, JSONObject owner_setting, List<JSONObject> sdk_privacy_info_list);

    /**
     * 获取隐私接口检测结果
     * 该接口获得隐私接口检测结果。提交代码审核前可通过该接口获取代码配置的地理位置以及其他隐私相关接口是否已经申请权限或者已经在ext.json里声明，便于开发者在提交代码审核之前发现问题并解决问题，以提高审核通过率
     * GET https://api.weixin.qq.com/wxa/security/get_code_privacy_info?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @return null
     */
    GetCodePrivacyInfoResult getCodePrivacyInfo(String access_token);

    /**
     * 小程序名称检测
     * 调用本 API 可以检测微信认证的名称是否符合规则
     * 该接口只允许通过api创建的小程序使用
     * POST https://api.weixin.qq.com/cgi-bin/wxverify/checkwxverifynickname?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param nick_name 名称（昵称）
     * @return null
     */
    CheckNickNameResult checkNickName(String access_token, String nick_name);

    /**
     * 设置小程序名称
     * 调用本接口可以设置小程序名称，当名称没有命中关键词，则直接设置成功；
     * 当名称命中关键词，需提交证明材料，并需要审核。审核结果会向消息与事件接收 URL 进行事件推送。
     * POST https://api.weixin.qq.com/wxa/setnickname?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param nick_name 名称（昵称）
     * @param id_card 身份证照片 mediaid，个人号必填
     * @param license 组织机构代码证或营业执照 mediaid，组织号必填
     * @return null
     */
    SetNickNameResult setNickName(String access_token, String nick_name, String id_card, String license);

    /**
     * 查询小程序名称审核状态
     * 调用设置名称接口，如果需要审核，会返回审核单 id（audit_id）,使用本接口可以查询改名审核状态
     * 该接口只允许通过api创建的小程序使用
     * POST https://api.weixin.qq.com/wxa/api_wxa_querynickname?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param audit_id 审核单 id，由设置名称接口返回
     * @return null
     */
    GetNickNameStatusResult getNickNameStatus(String access_token, Long audit_id);

    /**
     * 获取类目名称信息
     * 接口可获取已设置的二级类目及用于代码审核的可选三级类目
     * GET https://api.weixin.qq.com/wxa/get_category?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @return null
     */
    GetAllCategoryNameResult getAllCategoryName(String access_token);

    /**
     * 提交代码审核
     * 在调用commit为小程序上传代码后，可以调用本接口，将上传的代码提交审核；
     * POST https://api.weixin.qq.com/wxa/submit_audit?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param item_list 审核项列表（选填，至多填写 5 项）；类目是必填的，且要填写已经在小程序配置好的类目。
     * @return null
     */
    SubmitAuditResult submitAudit(String access_token, List<JSONObject> item_list);

    /**
     * 查询审核单状态
     * 通过接口提交审核后，调用本接口可以查询指定发布审核单的审核状态
     * POST https://api.weixin.qq.com/wxa/get_auditstatus?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param auditid 提交审核时获得的审核 id。
     * @return null
     */
    GetAuditStatusResult getAuditStatus(String access_token, Integer auditid);

    /**
     * 发布已通过审核的小程序
     * 调用本接口可以发布最后一个审核通过的小程序代码版本
     * 该接口只允许通过api创建的小程序使用
     * POST https://api.weixin.qq.com/wxa/release?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @return null
     */
    MiniBaseResult release(String access_token);


    /**
     * 获取不限制的小程序码
     * 该接口用于获取小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制
     * POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param scene 自定义参数 最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）
     * @return null
     * @author liuqi
     * @date 2023/11/17 10:34
     */
    byte[] getUnlimitedQRCode(String access_token, String scene);


    /**
     * 发送订阅消息
     * 该接口用于发送订阅消息
     * POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
     * @author liuqi
     * @date 2023/11/17 10:34
     * @param access_token 接口调用凭证，该参数为 URL 参数，非 Body 参数。使用component_access_token
     * @param template_id 所需下发的订阅模板id
     * @param page 点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转
     * @param touser 接收者（用户）的 openid
     * @param data   模板内容，格式形如 { "key1": { "value": any }, "key2": { "value": any } }的object字符串
     * @param miniprogram_state  跳转小程序类型：developer为开发版；trial为体验版；formal为正式版；默认为正式版
     * @param lang  进入小程序查看”的语言类型，支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)，默认为zh_CN
     * @return null
     */
    MiniBaseResult sendMessage(String access_token, Integer template_id, String page, String touser, String data, String miniprogram_state, String lang);

}
